#pragma once

#include <iostream>
#include <string>
#include <memory>
#include <thread>
#include <atomic>
#include <mutex>
#include <queue>
#include <condition_variable> 

#include "../mytcp.h"

// 客户端类
class ChatClient
{
private:
    std::shared_ptr<Socket> client_socket; // 客户端的Socket
    std::shared_ptr<InetAddress> server_addr; // 服务器地址
    std::atomic<bool> running; // 控制所有线程的运行状态

    std::thread network_io_thread; // 网络接收和发送线程
    std::thread input_thread;      // 用户输入线程
    
    // 网络接收消息队列
    std::queue<std::string> recv_message_queue; 
    std::mutex recv_queue_mutex; 

    // 用户输入消息队列 (待发送到服务器)
    std::queue<std::string> send_message_queue;
    std::mutex send_queue_mutex;
    std::condition_variable send_queue_cv; // 通知网络IO线程有消息待发送

    void networkIoLoop(); // 网络接收和发送的线程函数
    void getUserInput();  // 获取用户输入的线程函数

public:
    ChatClient(const char* ip, uint16_t port); // 构造函数
    ~ChatClient(); // 析构函数

    bool connectToServer(); // 连接到服务器
    void run(); // 运行客户端主循环
    
    // 从接收队列获取消息
    std::string getReceivedMessage();
    bool hasReceivedMessages();
    
    // 添加消息到发送队列
    void queueMessageToSend(const std::string& message);
};